package com.ninth_group.function;

import java.util.function.BiFunction;
import java.util.function.Function;

/**
 * 四参数函数
 * @param <T>
 * @param <U>
 * @param <V>
 * @param <W>
 * @param <R>
 */
@FunctionalInterface
public interface QuadFunction<T, U, V, W, R> {
    R apply(T t, U u, V v, W w);

    // 第一次部分应用
    default TriFunction<U, V, W, R> curryFirst(T t) {
        return (u, v, w) -> apply(t, u, v, w);
    }

    // 第二次部分应用，基于第一次的结果
    default BiFunction<V, W, R> currySecond(T t, U u) {
        return (v, w) -> apply(t, u, v, w);
    }

    // 第三次部分应用，基于前两次的结果
    default Function<W, R> curryThird(T t, U u, V v) {
        return w -> apply(t, u, v, w);
    }
}
